from ..common import *
from .judge import *
from .. import basetools

__all__ = [
    'register_for_settings_py', # 向 settings.py 文件中的列表对象增加一行注册信息
    'startapp', # 新建应用程序（仅创建，无注册等附带功能。有判断重复创建的功能）
    'create_new_app_easy', # 通用版创建应用程序
]

def startapp(app_name: str)->None:
    """新建应用程序
    
        校验名称必须只能用字母加数字 + 应用程序名不允许重复（在所有指定应用程序根路径下）
    """
    PROJECT_BASE_DIR = djangotools.SCONFIGS.dirname()
    if retools.PATT_CHARSNUMBER.match(app_name) and not djangotools.judge_app_exists(app_name):
        """""""""main"""
        """"""
        os.mkdir(os.path.join(PROJECT_BASE_DIR, app_name))
        APP_DIR = os.path.join(PROJECT_BASE_DIR, app_name)
        new_file(os.path.join(APP_DIR, '__init__.py'))
        new_file(os.path.join(APP_DIR, 'admin.py'), content=basetools.get_content('admin.django'))
        new_file(os.path.join(APP_DIR, 'apps.py'), content=basetools.get_content('apps.django', replace=True, app_name=app_name))
        new_file(os.path.join(APP_DIR, 'forms.py'), content=basetools.get_content('forms.django'))
        new_file(os.path.join(APP_DIR, 'models.py'), content=basetools.get_content('models.django'))
        new_file(os.path.join(APP_DIR, 'controller.py'), content=basetools.get_content('controller.django'))
        new_file(os.path.join(APP_DIR, 'tests.py'), content=basetools.get_content('tests.django'))
        new_file(os.path.join(APP_DIR, 'urls.py'), content=basetools.get_content('urls.django', replace=True, app_name=app_name))
        new_file(os.path.join(APP_DIR, 'views.py'), content=basetools.get_content('views.django'))
        """"""
        """""""""templates"""
        """"""
        # os.mkdir(os.path.join(APP_DIR, 'templates'))
        # os.mkdir(os.path.join(APP_DIR, 'templates', app_name))
        # os.mkdir(os.path.join(APP_DIR, 'templates', app_name, 'includes'))
        # TEMP_DIR = os.path.join(APP_DIR, 'templates', app_name)
        # new_file(os.path.join(TEMP_DIR, 'base.html'), content=basetools.get_content('baseHtml.django'))
        # new_file(os.path.join(TEMP_DIR, 'includes', 'paginator.html'), content=basetools.get_content('paginator.django'))
        """"""
        """""""""static"""
        """"""
        # os.mkdir(os.path.join(APP_DIR, 'static'))
        # os.mkdir(os.path.join(APP_DIR, 'static', app_name))
        # os.mkdir(os.path.join(APP_DIR, 'static', app_name, 'js'))
        # os.mkdir(os.path.join(APP_DIR, 'static', app_name, 'img'))
        # os.mkdir(os.path.join(APP_DIR, 'static', app_name, 'css'))
        """"""
        """""""""templatetags"""
        """"""
        # os.mkdir(os.path.join(APP_DIR, 'templatetags'))
        # new_file(os.path.join(APP_DIR, 'templatetags', '__init__.py'))
        # new_file(os.path.join(APP_DIR, 'templatetags', 'filter.py'), content=basetools.get_content('filter.django'))
        """"""
        """""""""migrations"""
        """"""
        os.mkdir(os.path.join(APP_DIR, 'migrations'))
        new_file(os.path.join(APP_DIR, 'migrations', '__init__.py'))
        """"""
        return 0
    else:
        return 1


def register_for_settings_py(name: str, type=retools.PATT_INSTALLED_APPS) -> int:
    """向 settings.py 文件中的列表对象增加一行注册信息
        name 两侧必须加引号（单双均可），如："'drf_generators'"

        注册成功返回 1
        失败返回 0
    """
    if not judge_installed_library(name, type=type):
        basetools.add_oneline_to_listattr(basetools.get_django_settings_path(), type, name)
        return 1
    else:
        return 0

def create_new_app_easy(app_name: str) -> int:
    """创建一个新的应用程序
    
        返回 -1 表示已经存在同名的应用程序（或命名不规范），不允许创建
        返回 1 表示创建成功
        返回 0 表示创建失败
        返回 2 表示创建成功，但注册失败

        使用方式：
        status = djangotools.create_new_app_easy('demo')
        if -1 == status:
            '''同名/命名不规范'''
        elif 0 == status:
            '''创建失败'''
        elif 2 == status:
            '''创建成功，注册失败'''
        elif 3 == status:
            '''创建成功，注册成功，路由未修复'''
        else:
            '''创建成功'''
    """
    try:
        status = startapp(app_name)
    except:
        return 0
    else:
        # 刷新配置文件
        djangotools.refresh_config()
        if 1 == status:
            return -1
        else:
            if 0 == register_for_settings_py(f"'{app_name}'"):
                return 2
            if 0 == djangotools.urls.fix_urls(f'{app_name}.urls'):
                return 3
            return 1
